package com.wang.tool.common.result;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.wang.tool.common.ErrorInfo;
import com.wang.tool.common.SimpleException;
import com.wang.tool.monitor.translator.GlobalErrorTranslator;

/**
 * 无结果模型仅提供通用函数
 *
 * @author shaopeng
 * @date 2023/5/23
 */
public class BaseResult implements ApiResult {
    private static final long serialVersionUID = -7387325273121030405L;

    public static final String SUCCESS = "success";

    /**
     * 是否成功
     */
    protected boolean success = true;

    /**
     * 响应码
     * success=false时代表异常码
     */
    protected String status = SUCCESS;

    /**
     * 信儿
     * status的补充log
     */
    protected String message;

    /**
     * 扩展信息
     */
    protected JSONObject ext;


    /**
     * 填充异常
     *
     * @param error
     */
    public void fillError(Throwable error) {
        this.fillError(GlobalErrorTranslator.translate(error));
    }

    /**
     * 填充异常
     *
     * @param error
     */
    public void fillError(ErrorInfo error) {
        fillError(error == null ? null : error.getErrorCode(), error == null ? null : error.getErrorMsg());
    }


    /**
     * 填充异常
     *
     * @param errorCode
     * @param errorMsg
     */
    public void fillError(String errorCode, String errorMsg) {
        this.success = false;
        this.status = errorCode == null ? SimpleException.UNKNOWN_ERROR : errorCode;
        this.message = errorMsg == null ? SimpleException.UNKNOWN_ERROR : errorMsg;
    }


    /**
     * 置入扩展属性
     *
     * @param key
     * @param val
     */
    public void putExt(String key, Object val) {
        if (key == null) {
            return;
        }
        ext = ext == null ? new JSONObject() : ext;
        ext.put(key, val);
    }

    /**
     * 删除扩展属性
     *
     * @param key
     */
    public void removeExt(String key) {
        if (ext == null) {
            return;
        }
        ext.remove(key);
    }

    /**
     * 指定类型取值
     *
     * @param key
     * @param type
     * @param <T>
     * @return
     */
    public <T> T getExt(String key, Class<T> type) {
        if (ext == null) {
            return null;
        }
        return ext.getObject(key, type);
    }

    /**
     * 指定类型取值
     *
     * @param key
     * @param type
     * @param <T>
     * @return
     */
    public <T> T getExt(String key, TypeReference<T> type) {
        if (ext == null) {
            return null;
        }
        return ext.getObject(key, type);
    }

    @Override
    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    @Override
    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    @Override
    public JSONObject getExt() {
        return ext;
    }

    @Override
    public void setExt(JSONObject ext) {
        this.ext = ext;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}
